package com.atguigu.gmall.demo.customer.controller;

import com.atguigu.gmall.demo.customer.bean.Customer;
import com.atguigu.gmall.demo.customer.service.CustomerService;
import com.atguigu.gmall.demo.customer.service.impl.CustomerImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @deprecated:
 * @author: tiancy
 * @create: 2021/11/2
 */

@RestController // 标识请求入口类,也是控制器
public class CustomerController {


    // 装配我们的服务层的对象.使用前提,必须在 serviceImpl上使用 @Service标注这是一个服务,并将这个对象创建等交给spring容器
    @Autowired
    CustomerService service;

    /**
     * http://localhost:8080/hello
     *
     * @return
     * @RequestMapping("/hello") : 将请求和方法做映射,当我们前端通过url访问进来后,照这个方法处理.
     */
    @RequestMapping("/hello")  //这个注解 : 通过浏览器访问的路径,会找这个方法.
    public String sayHello() {
        return "Hello SpringBoot";
    }

    /**
     * 获取浏览器传过来的参数,再响应给浏览器指定的字符串
     *
     * @param name
     * @param age
     * @return
     * @RequestParam : 这个注解:将前端url中传入参数与当前方法绑定,这里前端传入的 n = > name,a => age
     * 访问地址 : localhost:8080/showInfo?n=zhangsan&a=18
     */
    @RequestMapping("/showInfo")
    public String customerInfo(@RequestParam("n") String name, @RequestParam("a") Integer age) {
        return "Hello SpingBoot. name = " + name + ", age = " + age;
    }

    /**
     * @param customer
     * @return
     * @PostMapping("/customer") : 指定提交方式为post,提交一个表单.需要使用特殊的工具来模拟提交 : postMan、谷歌插件 YARC
     * @RequestBody : post提交时,需要提交一个表单,表单中的数据通过请求体传递.这里需要将请求体中的数据与方法中的参数绑定.
     * localhost:8080/customer
     * 提交的请求体 : {"id":1001,"name":"zhangsan","age":18}
     */
    @PostMapping("/customer")
    public String saveCustomer(@RequestBody Customer customer) {
        Integer id = customer.getId();
        String name = customer.getName();
        Integer age = customer.getAge();
        System.out.println(id + " : " + name + " : " + age);
        return "success";
    }

    // 模拟软件的三层架构,通过controller层调用service层.这里通过前端get请求,获取用户为1001的用户信息.
    @RequestMapping("/getCustomer")
    public String getCustomerById(@RequestParam("id") Integer id) {
        //调用service层.这里需要先通过spring容器,帮我们管理相关的依赖.通过依赖注入的方式,产生我们需要的对象.
        /*
            常规写法 : 直接new service的实现类.通过调用实现类中的方法,但是这样写会存在问题,每一个通过id获取用户信息的请求,都会执行这个方法.
            也就是说 : 没一次get请求都会创建一个新的对象.这个对象不能重用,太浪费资源了.
            解决方式 : 通过spring容器 来帮我们管理 使用到的对象.再这个项目跑起来的时候,就把我们要使用的对象创建出来.我们要用,就从容器中拿就行.
         */
        CustomerService service = new CustomerImpl();
        Customer customer = service.getCustomerById(id);
        return customer.getName() + "------" + customer.getAge();
    }

    /**
     * 通过spring依赖注入的方式,帮助我们管理创建对象.
     * 这里需要我们通过注解的方式,标明哪些对象需要我们加入到spring管理的容器中.
     * controller层 :
     * service层 : 在CustomerImpl上加入 @service : 声明具体的服务,将此服务的对象交给spring来帮我们创建.然后在controller层通过 @Autowired的方式注入.
     * dao层
     * @param id
     * @return
     */
    @RequestMapping("/getCustomer111")
    public String getCustomerByIdSpring(@RequestParam("id") Integer id) {
        //调用service层.这里需要先通过spring容器,帮我们管理相关的依赖.通过依赖注入的方式,产生我们需要的对象.
        /*
            解决方式 : 通过spring容器 来帮我们管理 使用到的对象.再这个项目跑起来的时候,就把我们要使用的对象创建出来.我们要用,就从容器中拿就行.
         */
        Customer customer = service.getCustomerById(id);
        return customer.getName() + "------" + customer.getAge();
    }

}
